
#ifndef WS_CLIENT_H
#define WS_CLIENT_H

#include <stdint.h>
#include <stdbool.h>

enum ws_opcode_type
{
    WS_FRAME_TXT			= 0x01,
    WS_FRAME_BINARY			= 0x02,
    WS_FRAME_CONNECT_CLOSE  = 0x08,
    WS_FRAME_PING			= 0x09,
    WS_FRAME_PONG			= 0x0a,
};

struct ws_frame
{
	enum ws_opcode_type opcode;
	char *payload;
	size_t payloadlen;
};

/**
 * @brief 构建握手请求数据
 *
 * @param buf 存储构建完成的数据
 * @param buf_sz buf最大存储长度
 * @param ip 服务器ip
 * @param port 服务器端口
 * @param path 服务器路径
 *
 * @retval true  构建成功
 *		   false buf长度不足
 */
size_t ws_build_handshake_req(char *buf, 
							  size_t buf_sz,
							  char const *ip,
							  char const *port,
							  char const *path);

/**
 * @brief 检测握手应答数据
 *
 * @param buf 应答数据缓存
 *
 * @retval true  握手成功
 *		   false 握手失败 
 */
bool ws_check_handshake_rsp(char const *buf);

/**
 * @brief 构建协议帧数据
 *
 * @param frame 指定帧的类型及负载
 * @param buf 存储构建完成的数据
 * @param buf_sz buf最大存储长度
 *
 * @retval 构建完成后帧总长度, 0表示构建失败
 *
 */
size_t ws_build_frame(struct ws_frame *frame, char *buf, size_t buf_sz);

/**
 * @brief 解析协议帧数据
 *
 * @param frame 存储解析后的帧内容
 * @param buf 完整帧数据缓存 
 * @param buf_sz 完整帧数据总长度 
 *
 * @retval true  解析成功
 *		   false 解析失败 
 */
bool ws_parse_recv_frame(struct ws_frame *frame, const char *buf, size_t buf_sz);

#endif

